今天说一个我常用的嵌入式 Linux 调试小技巧:设备树反编译

📖 精选 ✍️ Jason | 📅 2026-08-11 | 👍 1 | 原帖↗
#知识星球 #立芯嵌入式 #来源/立芯星球 #技术/设备树 #技术/Linux调试 #质量/精华

原帖 | Jason | 2026-08-11 14:03 | 👍1 | 阅读约1

今天说一个我常用的嵌入式 Linux 调试小技巧:设备树反编译。

我们修改设备树,只改源码 dts/dtsi,编译烧写,但多文件 include 叠加之后,真正生效的硬件节点,已经是合并之后的结果,原始源码看不出最终真实状态,这就是 dtb 反编译的价值。

  • DTS:设备树源码;DTSI:公共头文件,被多个 dts 复用 include

  • DTC:设备树编译器,把一堆 dts、dtsi,合并、编译生成二进制 DTB

  • DTB 是内核真正加载运行的二进制文件,板子实际生效的配置全部在这里。

多个 dtsi、dts 对同一个节点写属性,编译阶段 DTC 会做属性合并、覆盖。你本地看分散的源码,看不到合并之后真实值,容易踩坑。

dtb 反编译成可读dts文本

dtc -I dtb -O dts xxx.dtb -o out.dts

拿RK3566举例:

find -name *.dtb
dtc -I dtb -O dts rk3566-lubancat-1-mipi1080p.dtb -o dump.dts

打开 dump.dts,这就是板子实际跑的完整设备树,所有 include 合并完毕,没有任何宏,全部是最终生效属性。

什么时候一定要反编译?

1. 同一个硬件节点分散在 rk3566.dtsi、板级 dtsi、板级 dts 多个文件,属性互相覆盖,看源码分不清最终是什么值。反编译dtb 直接看合并之后真实结果。

2. 驱动 probe 失败,怀疑设备树属性写错,直接读 dump 出来的 dts,确认 status、reg、gpio、clock 这些最终值。

3. 拿到别人编译好的 dtb,没有原始 dts 源码,可以反向解析硬件配置(抄板常用,从板子里获取运行时设备树)。

注意事项:

1. 反编译出来的 dts 不能直接拿来编译回dtb,它是 dump 调试版本,丢失 include宏,语法会有小瑕疵(变成 16 进制),只用于阅读排查,不要当做工程源码修改。

2. 不要只看磁盘上的 dts 源码!内核真正认的是 dtb。改完 dts,确认 dtb 是否真的更新,很多时候编译没刷对 dtb,源码改了板子没变化。

3. 像野火鲁班猫这种板子,同一个SOC有很多屏幕变体:hdmi / mipi600p / mipi800p / mipi1080p,对应不同顶层 dts,生成不同dtb,选错 dtb 屏幕直接不工作。排查优先反编译当前实际加载的 dtb。

调试流程建议:

1. 确认板子烧录的是哪一份 dtb

2. 把这份 dtb 拿出来反编译

3. 在 dump 文件搜索报错对应的 node,核对 status、compatible、gpio、interrupt等属性

4. 定位问题之后,再回到原始 dts/dtsi 修改源码,重新编译。

一句话总结:dts/dtsi 是写代码用的,反编译 dtb 才是看板子真实硬件配置的手段。

有的平台支持直接用 adb/ssh 连板子,获取运行时设备树,都可以。

3c2d7f0c201d.jpg


相关笔记